package CamposDePotencial;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

import javax.vecmath.Point3d;

import comunicacion.Conector;
import estrategia.Utiles;


public class FabricaPotenciales {
	
	private CampoPotencial[] campos;
	private int cantObjetos;
	private int[] objetos;
	private Utiles utiles;
	
	private Properties prop;
	private final String pathConfig = "src/CamposDePotencial/Configuracion/DatosObjetos.properties";
	
	public enum TIPOS_CAMPOS {
		SEMIPLANO, CIRCULAR, UNIFORME
	};
	
	public enum TIPOS_OBJETOS {
		FUERTE, EJERCITO, ERROR
	};
	
	public enum PAREDES {
		ARRIBA, ABAJO, IZQ, DER
	};
	
	
	public FabricaPotenciales() {
	
		prop = new Properties();
		try {
			InputStream istream = new FileInputStream(pathConfig);
			prop.load(istream);
			
		} catch (FileNotFoundException e) {
			System.out.println("No se encontro el archivo de configuracion: " + pathConfig);
		} catch (IOException e) {
			System.out.println("Se produjo un error al levantar el archivo de configuracion");
		}
		
		String[] aux = prop.getProperty("OBJETOS").split(",");
		objetos = new int[aux.length];
		for(int i=0; i<aux.length; i++) {
			objetos[i] = Integer.parseInt(aux[i]);
		}
		cantObjetos = objetos.length;
		campos = new CampoPotencial[cantObjetos + 4];
		
	}
	
	
	public TIPOS_OBJETOS mapear(String t) {
		if (t.equals("FUERTE"))
			return TIPOS_OBJETOS.FUERTE;
		else if (t.equals("EJERCITO"))
			return TIPOS_OBJETOS.EJERCITO;
		else {
			return TIPOS_OBJETOS.ERROR;
		}
	}
	
	
	public CampoPotencial[] obtenerCampos(Conector conector) {
		utiles = new Utiles(conector);
		TIPOS_OBJETOS tipoObjeto;
		String color;
		

		// Obtengo el color de mi ejercito
		String miEjercito =  prop.getProperty("EJERCITO");
		
		for (int i=0; i<cantObjetos; i++) {
			// Obtengo los datos del objeto (tipoObjeto, color)
			String[] datosObjeto; 
			
			datosObjeto = prop.getProperty("OBJ" + objetos[i]).split(",");
			
		    tipoObjeto = mapear(datosObjeto[0]);
		    color = datosObjeto[1];
		    
		    Objeto objeto = new Objeto(objetos[i], tipoObjeto, conector);
		    int idObjetivo = Integer.parseInt(String.valueOf(prop.getProperty("OBJETIVO").charAt(3)));
		    
		    // Creamos el campo del objeto de acuerdo al tipo de obstaculo y considerando ademas
		    // los colores de fuertes y ejercitos
			switch (tipoObjeto) {
				case FUERTE:
					if (color.equals(miEjercito)) {
						//campos[i] = new CampoCircularAtractor(objeto, utiles);
						campos[i] = new CampoCircularRepulsor(objeto, utiles);
					} else {
						if (i == idObjetivo) {
							campos[i] = new CampoCircularAtractor(objeto, utiles);
						} else {
							campos[i] = new CampoCircularRepulsor(objeto, utiles);
						}
					}
					break;
				
				case EJERCITO:
					// Los robots amigos me repelen y el enemigo me atrae con un angulo
					if (color.equals(miEjercito)) {
						campos[i] = new CampoCircularRepulsor(objeto, utiles);
					} else {
						// campos[i] = new CampoConico(objeto, "+");
						if (objetos[i] == idObjetivo) {
							campos[i] = new CampoCircularAtractor(objeto, utiles);
						} else {
							campos[i] = new CampoCircularRepulsor(objeto, utiles);
						}
					}
					break;
					
				default: break;
					
			}
		}
		
		
		// Las paredes me repelen perpendicular al plano
		campos[cantObjetos] = new CampoSemiplano(PAREDES.ARRIBA, utiles);
		campos[cantObjetos+1] = new CampoSemiplano(PAREDES.ABAJO, utiles);
		campos[cantObjetos+2] = new CampoSemiplano(PAREDES.IZQ, utiles);
		campos[cantObjetos+3] = new CampoSemiplano(PAREDES.DER, utiles);
		
		return campos;
	}
	
	
	public Point3d mapearObjeto(String o) throws IOException {
		
		int numObj = Integer.parseInt(String.valueOf(o.charAt(3)));
		Point3d pos = new Point3d(0,0,0);

		for (int i=0; i<campos.length; i++){
			if (campos[i].objeto.getId() == numObj) {
				pos =  campos[i].objeto.getPosicion();
				break;
			}
		}
		
		return pos;
	}

}
